// import { store } from '@/store/store.js'

// 预览单图
function preview1(e) {
	uni.previewImage({ urls: [e] })
}

// 预览多图
function preview2(list,index) {
	uni.previewImage({
		urls: list,
		current: index
	})
	// let photoList=[]
	// return new Promise((resolve, reject) => {
	// 	list.forEach(item=>{
	// 		console.log(item.image);
	// 		photoList.push(item.image) 
	// 	})
	// 	resolve()
	// }).then(()=>{
	// 	console.log(photoList);
	// 	uni.previewImage({
	// 		urls: photoList,	
	// 		current: index
	// 	});
	// })
}

// 预览特定返回图片
function previewLB(e) {
	uni.previewImage({ urls: [getApp().globalData.baseUrl + e.image] })
}

function changeBase64(url) { //本地图片转base64
　var imgSrc = url // 图片本地路劲
　var image = new Image()
　image.src = imgSrc
　image.onload = () => {
　　var canvas = document.createElement('canvas')
　　canvas.width = image.width
　　canvas.height = image.height
　　var ctx = canvas.getContext('2d')
　　ctx.drawImage(image, 0, 0, image.width, image.height)
　　var ext = image.src.substring(image.src.lastIndexOf('.') + 1).toLowerCase()
　　var dataUrl = canvas.toDataURL('image/' + ext)
　　var base64 = JSON.parse(JSON.stringify(dataUrl)) // 这里就是转化成的编码
		console.log(base64)
　}
	console.log(image.src)
}

// 图片加前缀
function img(e) {
	// console.log(getApp().globalData.imgBaseUrl + e);
	let url = getApp().globalData.imgBaseUrl || ''
	return url + e
}

function navHeight () { //获取元素节点高度
	let _this=this
	// 创建节点选择器
	let query=wx.createSelectorQuery()
	query.select('#navHeight').boundingClientRect()
	query.exec(function(res){
		_this.navheight=res[0].height  
	})
}


// 验证邮箱格式
function email(sEmail) {
    var reg = /^([\w+\.])+@\w+([.]\w+)+$/
    return reg.test(sEmail)
}
function changeMobile(e) {
	// 正则修改手机号
	e = e ? e.toString() : ''
	return e.replace(/^(\w{3})\w{4}(.*)$/, '$1****$2')

}

// 校验含数字字母密码
function CheckPassWord(password) {
	var str = password
	var reg1 = new RegExp(/^[0-9A-Za-z]+$/)
	if (!reg1.test(str)) {
		return false
	}
	var reg = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/)
	if (reg.test(str)) {
		return true
	} else {
		return false
	}
}

// 校验不含中文或特殊字符
function regPassword(str) {
	let myReg = new RegExp(/^[a-zA-Z0-9_]{0,}$/)
	if (!myReg.test(str)) {
		return false
	}else {
		return true
	}
}

// 校验手机号格式
function checkPhone(phone) {
	//    /^(00)?82\-?0[71](?:\d{8,9})$/  验证韩国手机号0082-01012345678
	if (!(/^1[3456789]\d{9}$/.test(phone))) {
		uni.showToast({
			title:'手机号格式错误~',
			icon:'none'
		})
		return false
	} else {
		return true
	}
}

// 校验身份证号格式
function checkidnum(idnum) {
	if (!(/^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(idnum))) {
		uni.showToast({
			title:'身份证号格式错误~',
			icon:'none'
		})
		return false
	} else {
		return true
	}
}
// 


// 隐藏银行卡 19位
function changeBank(e) {
	// console.log(e);
	e = '' + e
	var ary = e.split('')
	ary.splice(4, 12, ' **** **** **** ')
	var num = ary.join('')
	return num
	
	// 方法二
	// let infoid='2312312312312312'
	// const plusXing=(str, frontLen, endLen,cha) => {
	// 	var len = str.length - frontLen - endLen;
	// 	var xing = '';
	// 	for (var i = 0; i < len; i++) {
	// 		xing += cha;
	// 	}
	// 	return str.substring(0, frontLen) + xing + str.substring(str.length - endLen);
	// }
	// console.log(plusXing(infoid,0,4,'*'););
	
}
/**
 * 13位时间戳转标准时间,如果10位则*1000
 * 
 * 在main.js中
	配置全局时间格式
	import formatTime from './plugins/utils/filters'
	Vue.prototype.formatTime=formatTime
	在页面中
	console.log(this.formatTime(this.time*1000,'YYYY-MM-DD hh:mm:ss'));
	
 *  filters.js
 * 对Date的扩展，将 Date 转化为指定格式的String  默认是2019-11-25 14:00:00 需要格式则后续传值
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * (new Date()).Format('yyyy-MM-dd hh:mm:ss.S') ==> 2019-11-25 08:09:04.423
 * (new Date()).Format('yyyy-M-d h:m:s.S')      ==> 2019-11-25 8:9:4.18
 * 使用格式,dom上 {{formatTime(time,'YYYY-MM-DD')}}
 * 在script中 this.formatTime(this.time,'hh:mm:ss')
 * 
 */
Date.prototype.Format = function(fmt) {
	var o = {
		'M+': this.getMonth() + 1, //月份
		'D+': this.getDate(), //日
		'h+': this.getHours(), //小时
		'm+': this.getMinutes(), //分
		's+': this.getSeconds(), //秒
		'q+': Math.floor((this.getMonth() + 3) / 3), //季度
		'S': this.getMilliseconds() //毫秒
	}
	if (/(Y+)/.test(fmt))
		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
	for (var k in o)
		if (new RegExp('(' + k + ')').test(fmt))
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
				.length)))
	return fmt
}

const dateCalculation = function(second) { //传入秒 返回天、时、分
	if (second > 0) {
		var day = 0
		var hour = 0
		var minute = 0
		var data = {}
		minute = Math.floor(second / (60))
		if (parseInt(minute) > 60) {
			hour = parseInt(minute / 60)
			minute %= 60 //算出有多分钟
		}
		if (parseInt(hour) > 24) {
			day = parseInt(hour / 24)
			hour %= 24 //算出有多分钟
		}
		data.day = day
		data.hour = hour
		data.minute = minute
		return data
	}
}

const formatTime = function(times, pattern) { //时间戳转年月日
	var d = new Date(times).Format('YYYY-MM-DD hh:mm:ss')
	if (pattern) {
		d = new Date(times).Format(pattern)
	}
	return d.toLocaleString()
}

const dateToTimestamp=function(dateStr) { //年月日转时间戳
	if (!dateStr) {
			return ''
	}
	let newDataStr = dateStr.replace(/\.|\-/g, '/')
	let date = new Date(newDataStr)
	let timestamp = date.getTime()
	return timestamp
}
const getlastDay=function(searchMonth) { // 获取当月最后一天
	var new_year = searchMonth.substring(0, 4) //取当前的年份
	var new_month = searchMonth.substring(searchMonth.length - 2) //取当前的月份
	var d = new Date(new_year, new_month, 1) //取当年当月中的第一天
	var lastDay = new Date(d.getTime() - 1000 * 60 * 60 * 24).getDate() //获取当月最后一天日期
	return lastDay
}
//  当前日期向前向推月份
function getNewDate(flag, many) {
  const thirtyDays = [4, 6, 9, 11] // 30天的月份
  const thirtyOneDays = [1, 3, 5, 7, 8, 10, 12] // 31天的月份
  const currDate = new Date() // 今天日期
  const year = currDate.getFullYear()
  let month = currDate.getMonth() + 1
  let targetDateMilli = 0
  let GMTDate = '' // 中国标准时间
  let targetYear = '' // 年
  let targetMonth = '' // 月
  let targetDate = '' // 日
  let dealTargetDays = '' // 目标日期
  const isLeapYear =
    !!((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) // 是否是闰年
  // console.log(isLeapYear, 'isLeapYear');
  let countDays = 0 // 累计天数
  for (let i = 0; i < many; i++) {
    if (flag === 'before') {
      month = month - 1 <= 0 ? 12 : month - 1
    } else {
      month = month + 1 > 12 ? 1 : month + 1
    }
    thirtyDays.includes(month)
      ? (countDays += 30)
      : thirtyOneDays.includes(month)
        ? (countDays += 31)
        : isLeapYear
          ? (countDays += 29)
          : (countDays += 28)
  }
  targetDateMilli = currDate.setDate(
    currDate.getDate() - (flag === 'before' ? countDays : countDays * -1)
  )
  GMTDate = new Date(targetDateMilli)
  targetYear = GMTDate.getFullYear()
  targetMonth = GMTDate.getMonth() + 1
  targetDate = GMTDate.getDate()
  targetMonth = targetMonth.toString().padStart(2, '0')
  targetDate = targetDate.toString().padStart(2, '0')
  dealTargetDays = `${targetYear}-${targetMonth}-${targetDate}`
  console.log(dealTargetDays, '处理的日期啊')
  return dealTargetDays
}

function num(e) {
	if (e > 9999) {
		return '9999+'
	} else {
		return e
	}
}

// 提示框
function toast(text, icon, duration, mask, position) {
	duration = duration || 2000
	mask = mask || false
	position = position || false
	icon = icon || 'none'
	// console.log(text, icon, duration, mask, position);
	uni.showToast({
		icon: icon,
		title: text,
		duration: duration,
		mask: mask,
		position: position,
	})
}
//加载中
function showLoading(text) {
	uni.showLoading({ title: text })
}
// 秒转时分秒
function changeTime(value) {
	let result = parseInt(value)
	let h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600)
	let m = Math.floor((result / 60) % 60) < 10 ? '0' + Math.floor((result / 60) % 60) : Math.floor((result / 60) % 60)
	let s = Math.floor(result % 60) < 10 ? '0' + Math.floor(result % 60) : Math.floor(result % 60)
	// 　　result = `${h}:${m}:${s}`
	result = `${h}:${m}:${s}`
	return result
}
// 字符串转数组
function changeList(e) {
	// console.log('e',e);
	if (Array.isArray(e)) {
		return e
	} else if (e === null || e === '') {
		return []
	} else if (typeof(e) === 'string') {
		// console.log(e.split(','));
		return e.split(',')
	}
}
// 切割时间
function splitTime(e) {
	if (e) {
		return e.split(' ')[0]
	}
}

//将数字转换成千分位
function formatNumber(params) {
		// 转为数字类型，保留小数点后两位，转为字符串
		params = Number(params).toFixed(2).toString()
		// 小数点前面的
		var frontNum = params.split('.')[0]
		// 小数点后面的
		// var rearNum = params.split('.')[1]
		// 增加千位符
		var newNum = frontNum.replace(/(\d+?)(?=(?:\d{3})+$)/g, '$1,')
		// console.log('含小数点', newNum + '.' + rearNum)
		return newNum
}
// 向上或向下取整
function formatInt(num, prec = 3, ceil = true) { //数字  取整位数  向上或者向下取整
	const len = String(num).length
	if (len < prec) {
			return num
	}
	const mult = Math.pow(10, prec)
	return ceil ? Math.ceil(num / mult) * mult : Math.floor(num / mult) * mult
}
function avg(array) {//封装求平均值函数
	var len = array.length
	var sum = 0
	for(var i = 0;i<len;i++){
			sum +=array[i]
	}
	return sum/len
}

// 判断文件类型
function judge(e) {
	var arr = e.split('.')
	// console.log(arr);
	// console.log(arr[arr.length - 1]);
	return arr[arr.length - 1]
}

// json数组去重封装
function delRepeatJson(arr=[],attrName='') { // 数组  去重的key值(字段名)
    var temp = {} //用于name判断重复
    var result = [] //最后的新数组

    arr.forEach(function (item) {
        if (!temp[item[attrName]]) {
            result.push(item)
            temp[item[attrName]] = true
        }
    })
    return result
}

// json多字段排序
function sortByArr(oddsRatio,type) {
	return function(a, b) {
		return type==='up' ? a[oddsRatio] - b[oddsRatio] : b[oddsRatio] - a[oddsRatio] // 升序或者降序
	}
}

// 数组去重
// var arr = ['aa', 'bb', 'cc', 'bb']
// var brr = []
// brr = [...new Set(arr)]
// console.log(arr);
// console.log(brr);

// 数组去重
// function uniqArr(arr) {
// 	return [...new Set(arr)]
// }

// // 字符串去重
// function uniqStr(str) {
// 	var newStr = '';
// 	for (let i = 0; i < str.length; i++) {
// 		if (newStr.indexOf(str[i]) == -1) {
// 			newStr += str[i];
// 		}
// 	}
// 	return newStr;
// }

// 对象合并
// Object.assign(obj, obj1);

function ishave(e, q, success) { //原生请求
	console.log(e, q, success)
	uni.request({
		url: getApp().globalData.baseUrl + '/SrpLogic/hasRes_and_getPayMoney',
		method: 'POST',
		data: {
			type: e,
			res_id: q
		},
		header: {
			'satoken': uni.getStorageSync('token'),
			'content-type': 'application/x-www-form-urlencoded'
		},
		success: res => {
			console.log(res)
			if (res.data.code === 200) {
				success(res.data.data)
			}
		}
	})
}

function setData(key, data) { //存储本地缓存
	try {
		uni.setStorageSync(key, data)
	} catch (e) {
			// error
	}
}

function getData(key) { //同步获取本地缓存
	try {
		const data = uni.getStorageSync(key)
		if (data) {
			return data
		}
	} catch (e) {
	   // error
	}
}

function validate(key, data){//判断验证是否符合要求
	let bool=true
	if(!data[key].rule.test(this[key])){
		//提示信息
		uni.showToast({
			title:data[key].msg,
			icon:'none'
		})
		//取反
		bool=false
		return false
	}
	return bool
}

function throttle(func, wait = 800, immediate = true) {// 节流
	if (immediate) {
		if (!flag) {
			flag = true
			// 如果是立即执行，则在wait毫秒内开始时执行
			typeof func === 'function' && func()
			timer = setTimeout(() => {
				flag = false
			}, wait)
		}
	} else {
		if (!flag) {
			flag = true
			// 如果是非立即执行，则在wait毫秒内的结束处执行
			timer = setTimeout(() => {
				flag = false
				typeof func === 'function' && func()
			}, wait)
		}

	}
}

function formatName(name) { //隐藏姓名 保留姓氏
	var newStr
	if (name.length === 2) {
			newStr = name.substr(0, 1) + '*'
	} else if (name.length > 2) {
			var char = ''
			for (let i = 0, len = name.length-1; i < len; i++) {
					char += '*'
			}
			newStr = name.substr(0, 1) + char + name.substr(-1, 0)
	} else {
			newStr = name
	}
	return newStr
}

// 0~999数字，支持2位小数
// /^0$|^[1-9]{1}\d{0,2}(\.\d{1,2})?$|0\.\d{1,2}$/

// 支持输入中文或英文，允许中文包含间隔符和横杠、英文包含空格
// /(^(?:[\u4e00-\u9fa5]+)[\.·\-:●]*(?:[\u4e00-\u9fa5]+)*$|^[a-zA-Z0-9]+\s?[\.·\-()a-zA-Z]*[a-zA-Z]+$)/

// 删除多余连接符>
'>0>0>'.replace(/(>{2,}|^>|>$)/g, '')

// 匹配路径查询参数：name=value
// new RegExp('(^|&)' + name + '=([^&]*)(&|$)')

// 身份证号码判断性别
export function idNum2Sex(string) {
  if (isIDnum(string)) {
    return
  }
  let sexNum = string.length === 18 ? value.slice(-2, -1) : value.slice(-1)
  return parseInt(sexNum) % 2 === 0 ? 'woman' : 'man'
}
/**
 * 生成验证码
 * @param length 长度
 * @param el 显示html元素的css选择器
 */
export function createCode(length = 4, el) {
  var code = ''
  var codeLength = parseInt(length)
  var checkCode = document.querySelector(el)
  var codeChars = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z')
  for (var i = 0; i < codeLength; i++) {
    var charNum = Math.floor(Math.random() * 62)
    code += codeChars[charNum]
  }
  if (checkCode) {
    checkCode.innerHTML = code
  }
}
//手机号识别并返回
export function isPhoneNumber(num) {
  if (!num) { return false };
  let str = num.toString()
  let val = str.replace(/[^0-9]/ig, '')
  if (val.length !== 11) { return false };
  var myreg = /^(((13[0-9]{1})|(14[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(17[0-9]{1})|(18[0-9]{1})|(19[0-9]{1})|)+\d{8})$/
  if (!myreg.test(val)) { return false } else { return val }
}

//给号码加上空格
export function mobileInput(num) {
  if (!num) { return };
  let newMobile = num.toString().replace(/[^0-9]/g, '')
  let str = newMobile.toString()
  let L = str.length
  let mobile = num
  if (L <= 3) {
    mobile = newMobile
  } else if (L > 3 && L <= 7) {
    mobile = str.substring(0, 3) + ' ' + str.substring(3, 7)
  } else if (L > 7 && L <= 11) {
    mobile = str.substring(0, 3) + ' ' + str.substring(3, 7) + ' ' + str.substring(7, 11)
  }
  return mobile
}

//银行卡号加上空格
export function BankInput(num) {
  if (!num) { return };
  let newBank = num.toString().replace(/[^0-9]/g, '')
  let str = newBank.toString()
  let L = str.length
  let bank = num
  if (L <= 4) {
    bank = newBank
  } else if (L > 4 && L <= 8) {
    bank = str.substring(0, 4) + ' ' + str.substring(4, 8)
  } else if (L > 8 && L <= 12) {
    bank = str.substring(0, 4) + ' ' + str.substring(4, 8) + ' ' + str.substring(8, 12)
  } else if (L > 12 && L <= 16) {
    bank = str.substring(0, 4) + ' ' + str.substring(4, 8) + ' ' + str.substring(8, 12) + ' ' + str.substring(12, 16)
  } else if (L > 16 && L <= 19) {
    bank = str.substring(0, 4) + ' ' + str.substring(4, 8) + ' ' + str.substring(8, 12) + ' ' + str.substring(12, 16) + ' ' + str.substring(16, 19)
  }
  return bank
}

/**
 验证身份证号是否正确
 **/
export function isIDnum(string) {
  var len = string.length
  if (len < 15 || len > 18) {
    return false
  }
  var re15 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/
  var re18 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}(\d|\X){1}$/g
  var res = re15.test(string) || re18.test(string)
  return res
}

/**
 * 验证是否为电子邮箱
 *
 * @param {} source
 */
export function isEmail(str) {
  var regex = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
  return str.search(regex) !== -1
}


/**
 * 校验Ip地址格式
 *
 * @param {} ipvale
 */
export function isIp(ipvale) {
  var regex = /^([1-9]|[1-9]\d|1\d{2}|2[0-1]\d|22[0-3])(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}$/
  var b = regex.test(ipvale)
  return b
}

//base64位转blob
export function convertBase64UrlToBlob(urlData) {
  let bytes = window.atob(urlData.split(',')[1]) //去掉url的头，并转换为byte
  //处理异常,将ascii码小于0的转换为大于0
  let ab = new ArrayBuffer(bytes.length)
  let ia = new Uint8Array(ab)
  for (let i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i)
  }
  return new Blob([ab], { type: this.type })
}

//输入区内容合法验证
export function checkInput(val) {
  val = String(val)
  var reg = /(script|href|on|iframe|frameset)/gi
  return !reg.test(val) //合法返回true
}

// 非法字符替换
export function replaceNo(val) {
  var reg = /(script|href|on|iframe|frameset)/gi
  return String(val).replace(reg, '') //返回替换后合法的字串
}

//图片格式判断
export function checkPic(str) {
  if (typeof str !== 'string') { return }
  let reg = /\.(jpg|png|jpeg|gif)$/i
  return reg.test(str)
}

//视频格式判断
export function checkVideo(str) {
  if (typeof str !== 'string') { return }
  let reg = /\.(mp4)$/i
  return reg.test(str)
}

/**提取图片
 * @str 图文内容
 * @num 图片最大数量
 */
export function extractImg(str, num = 3) {
  if (typeof str !== 'string') { return }
  // 提取含img标签的src 路径
  let reg = /<img[^(img)]*src=[\'\']?([^\'\']*)[\'\']?/gi,
    arr = str.match(reg),
    srcList = []
  if (arr && arr.length) {
    arr.length > num && (arr.length = num)
    arr.forEach(item => {
      // 提取src 路径并替换amp转义字符
      srcList.push(item.replace(/<img.*src=[\'\']|[\'\']|amp;/ig, ''))
    })
  }
  return srcList
}

/**
 * 头像URL过滤处理
 * @param  {[string]} url [description]
 * @return {[string]}     [处理后的URL]
 */
export function headerImgFilter(url) {
  let reg = /^http/i
  if (!reg.test(url)) {
    // url = url ? config.fileRoot + '/' + url : require('@/assets/images/user_head.jpg');
  }
  return url
}

/**
 * 大数字转换为K/W简写
 * @param  Number num [description]
 * @return String/Number    [description]
 */
export function numConvertText(num) {
  if (typeof num !== 'number') { return }
  if (num >= 10000) {
    return (num / 10000).toFixed(1) + 'w'
  }
  /*if (num >= 1000) {
      return (num/1000).toFixed(1) + 'k';
  }*/
  return num
}

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @description 得到两个数组的交集, 两个数组的元素为数值或字符串
 */
export const getIntersection = (arr1, arr2) => {
  let len = Math.min(arr1.length, arr2.length)
  let i = -1
  let res = []
  while (++i < len) {
    const item = arr2[i]
    if (arr1.indexOf(item) > -1) res.push(item)
  }
  return res
}

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @description 得到两个数组的并集, 两个数组的元素为数值或字符串
 */
export const getUnion = (arr1, arr2) => {
  return Array.from(new Set([...arr1, ...arr2]))
}

/**
 * @param {Array} target 目标数组
 * @param {Array} arr 需要查询的数组
 * @description 判断要查询的数组是否至少有一个元素包含在目标数组中
 */
export const hasOneOf = (targetarr, arr) => {
  return targetarr.some(_ => arr.indexOf(_) > -1)
}

/**
 * @param {Number} timeStamp 判断时间戳格式是否是毫秒
 * @returns {Boolean}
 */
const isMillisecond = timeStamp => {
  const timeStr = String(timeStamp)
  return timeStr.length > 10
}

/**
 * @param {Number} timeStamp 传入的时间戳
 * @param {Number} currentTime 当前时间时间戳
 * @returns {Boolean} 传入的时间戳是否早于当前时间戳
 */
const isEarly = (timeStamp, currentTime) => {
  return timeStamp < currentTime
}

/**
 * @param {Number} num 数值
 * @returns {String} 处理后的字符串
 * @description 如果传入的数值小于10，即位数只有1位，则在前面补充0
 */
const getHandledValue = num => {
  return num < 10 ? '0' + num : num
}

/**
 * @param {String|Number} timeStamp 时间戳
 * @returns {String} 相对时间字符串
 */
export const getRelativeTime = timeStamp => {
  // 判断当前传入的时间戳是秒格式还是毫秒
  const IS_MILLISECOND = isMillisecond(timeStamp)
  // 如果是毫秒格式则转为秒格式
  if (IS_MILLISECOND) Math.floor(timeStamp /= 1000)
  // 传入的时间戳可以是数值或字符串类型，这里统一转为数值类型
  timeStamp = Number(timeStamp)
  // 获取当前时间时间戳
  const currentTime = Math.floor(Date.parse(new Date()) / 1000)
  // 判断传入时间戳是否早于当前时间戳
  const IS_EARLY = isEarly(timeStamp, currentTime)
  // 获取两个时间戳差值
  let diff = currentTime - timeStamp
  // 如果IS_EARLY为false则差值取反
  if (!IS_EARLY) diff = -diff
  let resStr = ''
  const dirStr = IS_EARLY ? '前' : '后'
  // 少于等于59秒
  if (diff <= 59) resStr = diff + '秒' + dirStr
  // 多于59秒，少于等于59分钟59秒
  else if (diff > 59 && diff <= 3599) resStr = Math.floor(diff / 60) + '分钟' + dirStr
  // 多于59分钟59秒，少于等于23小时59分钟59秒
  else if (diff > 3599 && diff <= 86399) resStr = Math.floor(diff / 3600) + '小时' + dirStr
  // 多于23小时59分钟59秒，少于等于29天59分钟59秒
  else if (diff > 86399 && diff <= 2623859) resStr = Math.floor(diff / 86400) + '天' + dirStr
  // 多于29天59分钟59秒，少于364天23小时59分钟59秒，且传入的时间戳早于当前
  else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) resStr = getDate(timeStamp)
  else resStr = getDate(timeStamp, 'year')
  return resStr
}

/**
 * 发布时间格式化
 * @dateString:'2018-1-6 15:25:42'
 */
export function publishTimeFormat(dateString) {
  if (typeof dateString !== 'string') { return }
  let pubDate = new Date(dateString.replace(/-/g, '/')),
    curDate = new Date(),
    pubMillis = +pubDate,
    pubYear = pubDate.getFullYear(),
    curMillis = +curDate,
    curYear = curDate.getFullYear(),
    difference = curMillis - pubMillis
  if (difference < 4.32e+7) { //12小时内
    if (difference < 3.6e+6) { //60分钟内
      if (difference < 60000) { //60秒内
        dateString = '刚刚'
      } else {
        dateString = Math.floor(difference / 60000) + '分钟前'
      }
    } else {
      dateString = Math.floor(difference / 3600000) + '小时前'
    }
  } else if (pubYear === curYear) {
    dateString = dateString.substr(5)
  }
  return dateString
}

// 日期时间字符串转为yyyy-mm-dd HH:mm:ss w格式
export function dateFormat(dateString, fmt = 'yyyy-MM-dd hh:mm:ss') {
  if (!dateString) {
    return
  }
  var date = new Date(dateString.replace(/-/g, '/'))
  var o = {
    'M+': date.getMonth() + 1, //月份
    'd+': date.getDate(), //日
    'h+': date.getHours(), //小时
    'm+': date.getMinutes(), //分
    's+': date.getSeconds(), //秒
    'q+': Math.floor((date.getMonth() + 3) / 3), //季度
    'S+': date.getMilliseconds(), //毫秒
    'w+': '星期' + '日一二三四五六'.charAt(date.getDay()) //星期
  }

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  }

  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 || String(o[k]).length > 1 ? o[k] : '0' + o[k])
    }
  }

  return fmt
}

// 简易时间格式化：2020-02-02 20:20:20
export function dateFormat1(dateString) {
	if (!dateString) {
    	return
  	}
  	var date = new Date(dateString.replace(/-/g, '/'))
	date.setMinutes(date.getMinutes() - date.getTimezoneOffset()) // toJSON 的时区补偿
	return date.toJSON().substring(0, 19).replace(/[T]/g, ' ')
}


/**
 * @returns {String} 当前浏览器名称
 */
export const getExplorer = () => {
  const ua = window.navigator.userAgent
  const isExplorer = exp => {
    return ua.indexOf(exp) > -1
  }
  if (isExplorer('MSIE')) return 'IE'
  else if (isExplorer('Firefox')) return 'Firefox'
  else if (isExplorer('Chrome')) return 'Chrome'
  else if (isExplorer('Opera')) return 'Opera'
  else if (isExplorer('Safari')) return 'Safari'
}

/**
 * 判断一个对象是否存在key，如果传入第二个参数key，则是判断这个obj对象是否存在key这个属性
 * 如果没有传入key这个参数，则判断obj对象是否有键值对
 */
export const hasKey = (obj, key) => {
  if (key) return key in obj
  else {
    let keysArr = Object.keys(obj)
    return keysArr.length
  }
}

/**
 * @param {*} obj1 对象
 * @param {*} obj2 对象
 * @description 判断两个对象是否相等，这两个对象的值只能是数字或字符串
 */
export const objEqual = (obj1, obj2) => {
  const keysArr1 = Object.keys(obj1)
  const keysArr2 = Object.keys(obj2)
  if (keysArr1.length !== keysArr2.length) return false
  else if (keysArr1.length === 0 && keysArr2.length === 0) return true
  /* eslint-disable-next-line */
  else return !keysArr1.some(key => obj1[key] != obj2[key])
}

/**
 * 合法uri
 * @param {String} url 路径
 */
export function validateURL(url) {
  const reg = /^(https|http|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|xyz|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  // const reg = /([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|xyz|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * logo 过滤处理
 * @param {*} str url
 */
export function transLogo(str) {
  if (str)
    return str
  // else
  //   return require('@/assets/images/defaultLogo.jpg')

}

/**
 * 文件体积格式化
 * @param {*} num 体积大小，单位Byte
 */
export function formatFileSize(num) {
  num = parseInt(num)
  if (num < 1e+3) {
    num += 'B'
  } else if (num < 1e+6) {
    num = (num / 1e+3).toFixed(2) + 'KB'
  } else if (num < 1e+9) {
    num = (num / 1e+6).toFixed(2) + 'M'
  } else {
    num = (num / 1e+9).toFixed(2) + 'G'
  }
  return num
}

// 创建唯一字符串
export function createUniqueString() {
  const timestamp = +new Date() + ''
  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
  return (+(randomNum + timestamp)).toString(32)
}

/**
 * This is just a simple version of deep copy
 * Has a lot of edge cases bug
 * If you want to use a perfect deep copy, use lodash's _.cloneDeep
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'shallowClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
}

/**
 * 对象合并
 * @param {*} target 合并到的目标对象
 * @param {*} source 被合并到的对象
 */
export function objectMerge(target, source) {
  /* Merges two  objects,
     giving the last one precedence */

  if (typeof target !== 'object') {
    target = {}
  }
  if (Array.isArray(source)) {
    return source.slice()
  }
  Object.keys(source).forEach(property => {
    const sourceProperty = source[property]
    if (typeof sourceProperty === 'object') {
      target[property] = objectMerge(target[property], sourceProperty)
    } else {
      target[property] = sourceProperty
    }
  })
  return target
}

/**
 * 请求路径参数转为对象
 * @param {*} url 
 */
export function query2obj(url) {
  url = url === null ? window.location.href : url
  const search = url.substring(url.lastIndexOf('?') + 1)
  search = search && search.split('#')[0]
  if (!search) {
    return {}
  }
  const obj = {}
  const reg = /([^?&=]+)=([^?&=]*)/g
  search.replace(reg, (rs, $1, $2) => {
    const name = decodeURIComponent($1)
    let val = decodeURIComponent($2)
    val = String(val)
    obj[name] = val
    return rs
  })
  return obj
}

/**
 * Obj转为路径query请求参数
 * @param {*} obj 
 */
export function obj2query(obj) {
  if (!obj) return ''
  return cleanArray(
    Object.keys(obj).map(key => {
      if (obj[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])
    })
  ).join('&')
}

/**
 * 获取query请求参数中name对应的值
 * @param string name 
 */
export function getQueryValue(name) {
const search = decodeURIComponent(url)
    .split('?')[1]
    .split('#')[0]
  if (!search) {
    return ''
  }
  let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
  let r = search.match(reg)
  if (r !== null) {
    return r[2]
  }
  return ''
}

/**
 * @param {Sting} input value
 * @returns {number} output value
 */
export function byteLength(str) {
  // returns the byte length of an utf8 string
  let s = str.length
  for (var i = str.length - 1; i >= 0; i--) {
    const code = str.charCodeAt(i)
    if (code > 0x7f && code <= 0x7ff) s++
    else if (code > 0x7ff && code <= 0xffff) s += 2
    if (code >= 0xDC00 && code <= 0xDFFF) i--
  }
  return s
}

/**
* 判断当前系统类型
*/
export function judgeSystem() {
  if (navigator.userAgent.indexOf('MicroMessenger') > -1) {
    return 'weChat'
  } else if (!!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) {
    return 'ios'
  } else if (navigator.userAgent.indexOf('Android') > -1) {
    return 'android'
  } else if (location.protocol.toLowerCase().indexOf('file') > -1) {
    return 'native'
  } else if (!!location.href.match('192')) {
    return 'ip'
  } else if (/iphone/gi.test(navigator.userAgent) && (screen.height === 812 && screen.width === 375)) {
    return 'iPhoneX'
  }
}
/**
 * 数组转为树结构
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function arrToTree(data, id, parentId, children) {
  id = id || 'id'
  parentId = parentId || 'parentId'
  children = children || 'children'
  let result = []
  if (!Array.isArray(data)) {
    return result
  }
  data.forEach(item => {
    delete item[children]
  })
  let map = {}
  data.forEach(item => {
    map[item[id]] = item
  })
  data.forEach(item => {
    let parent = map[item[parentId]]
    if (parent) {
      (parent[children] || (parent[children] = [])).push(item)
    } else {
      result.push(item)
    }
  })
  return result
}

/**
* 将秒转换为 分:秒
* s int 秒数
*/
export function secondToTime(s) {
  var h
  h = Math.floor(s / 60)
  s = s % 60
  h += ''
  s += ''
  h = (h.length === 1) ? '0' + h : h
  s = (s.length === 1) ? '0' + s : s
  return h + ':' + s
}

  // ArrayBuffer 转为字符串，参数为 ArrayBuffer 对象
  //  ArrayBuffer转为字符串，或者字符串转为ArrayBuffer，有一个前提，即字符串的编码方法是确定的。假定字符串采用 UTF-16 编码（JavaScript 的内部编码方式）
  export function ab2str(buf) {
    // 注意，如果是大型二进制数组，为了避免溢出，
    // 必须一个一个字符地转
    if (buf && buf.byteLength < 1024) {
      return String.fromCharCode.apply(null, new Uint16Array(buf))
    }
  
    const bufView = new Uint16Array(buf)
   const len = bufView.length
   const bstr = new Array(len)
   for (let i = 0; i < len; i++) {
     bstr[i] = String.fromCharCode.call(null, bufView[i])
   }
   return bstr.join('')
 }
 
 // 字符串转为 ArrayBuffer 对象，参数为字符串
 export function str2ab(str) {
   const buf = new ArrayBuffer(str.length * 2) // 每个字符占用2个字节
   const bufView = new Uint16Array(buf)
   for (let i = 0, strLen = str.length; i < strLen; i++) {
     bufView[i] = str.charCodeAt(i)
   }
   return buf
 }

// 判断是否为移动端
export function isMobile() {
  let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
  )
  return flag
}

// RSA加密
// import JSEncrypt from 'jsencrypt/bin/jsencrypt'

// 密钥对生成 http://web.chacuo.net/netrsakeypair

const publicKey =
  'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
  'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='

const privateKey =
  'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
  '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
  'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
  'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
  'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
  'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
  'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
  'UP8iWi1Qw0Y='

// 加密
export function encrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPublicKey(publicKey) // 设置公钥
  return encryptor.encrypt(txt) // 对数据进行加密
}

// 解密
export function decrypt(txt) {
  const encryptor = new JSEncrypt()
  encryptor.setPrivateKey(privateKey) // 设置私钥
  return encryptor.decrypt(txt) // 对数据进行解密
}

// AES加密
// import CryptoJS from 'crypto-js'
let keyAES = 'qykj@20221101_te'

//加密
export function encryptAES(str) {
  var key = CryptoJS.enc.Utf8.parse(keyAES)
  var srcs = CryptoJS.enc.Utf8.parse(str)
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  })
  return encrypted.toString()
}

//解密
export function decryptAES(str) {
  var key = CryptoJS.enc.Utf8.parse(keyAES)
  var decrypt = CryptoJS.AES.decrypt(str, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  })
  return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}

// base64加密
export function encryptB64(str) {
  return window.btoa(
    encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
      return String.fromCharCode('0x' + p1)
    })
  )
}

// base64解密
export function decryptB64(str) {
  const keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  function utf8_decode(utftext) {
    var string = ''
    var i = 0
    var c = 0
    var c1 = 0
    var c2 = 0
    while (i < utftext.length) {
      c = utftext.charCodeAt(i)
      if (c < 128) {
        string += String.fromCharCode(c)
        i++
      } else if (c > 191 && c < 224) {
        c1 = utftext.charCodeAt(i + 1)
        string += String.fromCharCode(((c & 31) << 6) | (c1 & 63))
        i += 2
      } else {
        c1 = utftext.charCodeAt(i + 1)
        c2 = utftext.charCodeAt(i + 2)
        string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63))
        i += 3
      }
    }
    return string
  }
  function decode(input) {
    var output = ''
    var chr1, chr2, chr3
    var enc1, enc2, enc3, enc4
    var i = 0
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '')
    while (i < input.length) {
      enc1 = keyStr.indexOf(input.charAt(i++))
      enc2 = keyStr.indexOf(input.charAt(i++))
      enc3 = keyStr.indexOf(input.charAt(i++))
      enc4 = keyStr.indexOf(input.charAt(i++))
      chr1 = (enc1 << 2) | (enc2 >> 4)
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
      chr3 = ((enc3 & 3) << 6) | enc4
      output = output + String.fromCharCode(chr1)
      if (enc3 !== 64) {
        output = output + String.fromCharCode(chr2)
      }
      if (enc4 !== 64) {
        output = output + String.fromCharCode(chr3)
      }
    }
    output = utf8_decode(output)
    return output
  }
  return decode(str)
}


export function onPageScroll(res) { //监听滚动距离导航栏显隐  记录（直接用不可调用）
	//获取距离顶部距离
	console.log(res.scrollTop)
	const scrollTop = res.scrollTop
	let opacityNum=0 //透明度
	if (scrollTop >= 0) {
		// 导航条颜色透明渐变
		if (scrollTop <= 20) {
			opacityNum = 1
		} else if (20 < scrollTop && scrollTop <= 100) {
			opacityNum = scrollTop / 100
		} else if (scrollTop > 100) {
			opacityNum = 0
		}
	}
}

function TreeToArray(tree) {
		// 判断 tree 是否有值，无返回 []
		if (!Array.isArray(tree) || !tree.length) return []
		let res = []
		tree.forEach(v => {
				// tree的每个元素都 放入到 res里面
				res.push(v.permissions)
				if (v.children) {
						// 有children 就把 children数据递归 返回  依次放到 res里面
						res.push(...TreeToArray(v.children))
				}
				if (v.brothers) {
						// 有brothers 就把 brothers数据递归 返回  依次放到 res里面
						res.push(...TreeToArray(v.brothers))
				}
		})
		return res
}
// function isPermissions(identifying){
// 	return store.state.menuPermissionsId.indexOf(identifying) !== -1
// }

function IsNum(s){
	if (s !== null && s!==''){
		return !isNaN(s)
	}
	return false
}

function extractNumbers(str) { // 提取字符串中的数字
		let match = str.match(/\d+/g)
		return match ? match.join('') : ''
}

export default {
	// isPermissions,// 是否有权限
	TreeToArray, // 树结构转数组
	CheckPassWord, // 校验含数字字母密码
	regPassword, // 校验不含中文或特殊字符
	checkPhone, // 校验手机号格式
	checkidnum, // 校验身份证号格式
	preview1, // 查看单图
	preview2,// 查看多图
	previewLB,// 查看特定返回图片
	changeBase64, //本地图片转base64
	navHeight,// 获取节点高度
	img,
	dateCalculation, //时间戳转天 时 分
	formatTime, // 时间戳转年月日
	dateToTimestamp, //年月日转时间戳
	getlastDay, // 获取当月最后一天
	getNewDate, // getNewDate('before', 3) //今天向前3个月 getNewDate('after', 2)  //今天向后2个月
	changeMobile,
	changeBank, //隐藏银行卡号
	num,
	toast, //提示
	showLoading,
	changeTime,
	changeList,
	splitTime, // 切割时间
	judge, // 判断媒体格式
	delRepeatJson, // json数组去重
	sortByArr, // json数组排序
	ishave, //原生请求
	setData,//存储本地缓存
	getData,//同步获取本地缓存
	validate, //判断验证是否正确
	email, //验证邮箱格式
	throttle, //节流
	formatName, //隐藏名字
	formatNumber,//	将数字转换成千分位
	formatInt, // 数字向上或向下取整
	avg, // 求数组平均值
	IsNum, // 判断是否是纯数字
	extractNumbers, // 提取字符串中的数字
}
